home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #02 (Apr85-Jul85) / modula 2 / modula Vol. 1 #6 / HanoiPuzzle.MOD next >
Text File  |  1985-02-26  |  1KB  |  56 lines

  1. MODULE HanoiPuzzle;
  2.  
  3. (* Declare I/O from Modula-2 Standard Library *)
  4. FROM Terminal IMPORT ClearScreen;
  5. FROM InOut IMPORT WriteLn, WriteString, WriteCard, ReadCard,
  6.                   Write;
  7.          
  8. CONST Start = "a";
  9.       Int = "b";
  10.       Finish = "c";
  11.       
  12. VAR DiskCount: CARDINAL; Done: BOOLEAN;
  13.  
  14. (* Get number of disks or set terminate flag *)
  15. PROCEDURE GetInput (VAR NumberOfDisks: CARDINAL;
  16.                     VAR Quit: BOOLEAN);
  17. BEGIN
  18.    ClearScreen;
  19.    WriteString("Enter number of disks (between 3 and 9)");
  20.    WriteLn;
  21.    WriteString("To quit - enter number out of range");
  22.    WriteLn;
  23.    ReadCard(NumberOfDisks);
  24.    IF (NumberOfDisks < 3) OR (NumberOfDisks > 9)
  25.       THEN Quit := TRUE
  26.       ELSE Quit := FALSE
  27.    END; (*IF*)
  28.    ClearScreen;
  29. END GetInput;
  30.  
  31. (* The recursive guts of the programs ... calculate moves. *)
  32. PROCEDURE Hanoi(n: CARDINAL; StartNeedle, IntNeedle,
  33.                  FinishNeedle: CHAR);
  34. BEGIN
  35.    IF n#0
  36.       THEN
  37.      Hanoi(n-1, StartNeedle, FinishNeedle, IntNeedle);
  38.      WriteLn;
  39.      WriteString("Move disk -");
  40.      WriteCard(n,2);
  41.      WriteString(" from ");
  42.      Write(StartNeedle);
  43.      WriteString(" to ");
  44.      Write(FinishNeedle);
  45.      Hanoi(n-1, IntNeedle, StartNeedle, FinishNeedle);
  46.    END; (*IF*)
  47. END Hanoi;
  48.  
  49. (* Mainline ... control main loop ... get input & do it. *)
  50. BEGIN
  51.    GetInput(DiskCount, Done);    
  52.    WHILE NOT Done DO
  53.       Hanoi(DiskCount, Start, Int, Finish);
  54.       GetInput(DiskCount, Done);
  55.    END; (*WHILE*)
  56. END HanoiPuzzle.